home *** CD-ROM | disk | FTP | other *** search
/ MASPC 1 / MASPC_1.iso / Demos / Demo DIV / DATA / PRG / JUEGOS / PUZZLE.PRG < prev    next >
Encoding:
Text File  |  1997-11-28  |  15.2 KB  |  417 lines

  1.  
  2. //--------------------------------------------------------------------
  3. // TITULO: PUZZLE 'O' MATIC
  4. // AUTOR:  DANIEL NAVARRO
  5. // FECHA   25/08/97
  6. //--------------------------------------------------------------------
  7.  
  8. PROGRAM puzzle;
  9.  
  10. GLOBAL
  11.  
  12.     cogida;             // Bandera-> 1.- Con una pieza cogida, 0.- Sin pieza cogida
  13.     rotando;            // Bandera-> 1.- Se esta rotando una pieza, 0.- No se esta rotando nada
  14.     última_z;           // Ultima coordenada z de las piezas, para ir poniendo las piezas por delante
  15.     piezas_colocadas;   // Numero de piezas colocadas
  16.  
  17.     nivel;              // Nivel actual
  18.     nivel2;             // Guarda temporalmente el nivel al que se va a pasar
  19.  
  20.     fuente;             // Fuente actual que se esta usando
  21.  
  22.     // Nombres de las fuentes que se tienen que cargar
  23.     fuentes[]=
  24.         "puzzle\puzzle1.fnt","puzzle\puzzle2.fnt","puzzle\puzzle3.fnt",
  25.         "puzzle\puzzle4.fnt","puzzle\puzzle5.fnt";
  26.  
  27.     fichero;            // Fichero de gráficos que se esta usando
  28.  
  29.     // Nombres de los ficheros gráficos que se tienen que usar
  30.     ficheros[]=
  31.         "puzzle\puzzle.fpg","puzzle\puzzle2.fpg","puzzle\puzzle3.fpg",
  32.         "puzzle\puzzle4.fpg","puzzle\puzzle5.fpg";
  33.  
  34.     tiempo;             // Contador del tiempo restante
  35.     tiempo_anterior;    // Variable temporal donde se guarda el tiempo restante
  36.     tiempo_restante;    // Tiempo que va sobrando de un nivel a otro
  37.  
  38.     // Tiempos totales de cada fase
  39.     tiempos[]=
  40.         250,200,150,100,50;
  41.  
  42.     récord;             // Contador del tiempo que se tiene para superar el récord
  43.     mensaje_récord;     // Bandera-> 1.-Se ha hecho récord
  44.  
  45.     // Tabla que guarda los récords de cada nivel
  46.     récords[]=
  47.         250,250,250,250,250;
  48.  
  49.     // Identificadores de los textos que aparecen en el juego
  50.     texto1,texto2,texto3,texto4,texto5;
  51.  
  52.     // Identificadores de sonidos
  53.     idsonido1,idsonido2,idsonido3,idsonido4,idsonido5,idsonido6,idsonido7;
  54.  
  55. BEGIN
  56.     // Selecciona del modo de vídeo y los frames por segundo
  57.     set_mode(m640x480);
  58.     set_fps(32,0);      // Selecciona el número de imagenes por segundo
  59.  
  60.     // Carga los sonidos
  61.     idsonido1=load_pcm("puzzle\cogida.pcm",0);
  62.     idsonido2=load_pcm("puzzle\dejada.pcm",0);
  63.     idsonido3=load_pcm("puzzle\girando.pcm",0);
  64.     idsonido4=load_pcm("puzzle\colocada.pcm",0);
  65.     idsonido5=load_pcm("puzzle\alarma.pcm",0);
  66.     idsonido6=load_pcm("puzzle\acaba.pcm",0);
  67.     idsonido7=load_pcm("puzzle\consigue.pcm",0);
  68.  
  69.     // Carga los récords guardados
  70.     load("puzzle\puzzle.dat",offset récords);
  71.  
  72.                             // Carga las 35 piezas de ficheros map
  73.     FROM x=0 TO 34;         // Usa la variable predefinida como contador
  74.         load_map("puzzle\puzzle.map");
  75.     END
  76.  
  77.                             // Bucle principal
  78.     LOOP
  79.  
  80.         fade_on();          // Enciende la pantalla
  81.  
  82.         // Carga la pantalla del menú principal y la pone en pantalla
  83.         load_pal("puzzle\puzmenu.map");
  84.         graph=load_map("puzzle\puzmenu.map");   // Usa la variable graph para cargarlo
  85.         put_screen(0,graph);
  86.         unload_map(graph);                      // Descarga el gráfico para recuperar memoria
  87.         graph=0;                                // Quita el gráfico para que no se imprima
  88.  
  89.         // Repite hasta que se pulse F1 para empezar a jugar
  90.         REPEAT
  91.  
  92.             FRAME;
  93.  
  94.             // Si se pulsa la tecla escape se graba los récords y se sale del programa
  95.             IF (key(_esc))
  96.                 fade_off();
  97.                 save("puzzle\puzzle.dat",offset récords,sizeof(récords));
  98.                 exit("",0);
  99.             END
  100.  
  101.         UNTIL (key(_f1));
  102.  
  103.         fade_off();             // Apaga la pantalla y la borra
  104.         clear_screen();
  105.  
  106.                                 // Reinicializa el juego
  107.         nivel=0 ;
  108.         tiempo_restante=0;
  109.  
  110.                                 // Bucle principal del juego
  111.         LOOP
  112.  
  113.             // Carga el puzzle del nivel y la fuente, todo ello con su paleta
  114.             fichero=load_fpg(ficheros[nivel]);
  115.             fuente=load_fnt(fuentes[nivel]);
  116.             load_pal(ficheros[nivel]);
  117.             put_screen(0,2);
  118.             mouse.graph=200;    // Selecciona el cursor del ratón
  119.  
  120.  
  121.             // Crea las piezas del puzzle
  122.             FROM y=0 TO 6;
  123.                 FROM x=0 TO 4;
  124.  
  125.                    // Copia el bloque gráfico a cada pieza que es un código del fichero de gráficos
  126.                    map_block_copy(0,1000+y*5+x,0,0,1,x*64,y*64,64,64);
  127.  
  128.                    // Mueve y gira las piezas en posiciones aleatorias cuando las crea
  129.                    pieza(1000+y*5+x,rand(32,608),rand(200,448),rand(0,3)*90000,192+x*64,48+y*64);
  130.                 END
  131.             END
  132.             fade_on();          // Enciende la pantalla
  133.  
  134.             // Reinicializa las variables del nivel
  135.             cogida=0;                               // Pieza cogida
  136.             rotando=0;                              // Pieza rotando
  137.             última_z=-1;                            // Profundidad de la última pieza puesta
  138.             piezas_colocadas=0;                     // Piezas puestas
  139.             nivel2=nivel+1;                         // Variable temporal que guarda el nivel
  140.             tiempo=tiempos[nivel]+tiempo_restante;  // Tiempo restate
  141.             récord=récords[nivel];                  // Tiempo record
  142.  
  143.             // Pone los textos necesarios
  144.             write(fuente,72,0,1,"TIEMPO");
  145.             write_int(fuente,72,24,1,&tiempo);
  146.             write(fuente,72,80,1,"RECORD");
  147.             write_int(fuente,72,104,1,&récord);
  148.             texto1=write(fuente,320,240,4,"PULSE EL RATON");
  149.             texto2=write(fuente,320,264,4,"PARA JUGAR EL NIVEL");
  150.             texto3=write_int(fuente,320,290,4,&nivel2);
  151.             IF (nivel>0)
  152.                 texto4=write(fuente,320,120,4,"TIEMPO SOBRANTE");
  153.                 texto5=write_int(fuente,320,150,4,&tiempo_restante);
  154.             END
  155.  
  156.             // Espera hasta que se pulse el botón del ratón
  157.             REPEAT FRAME; UNTIL (mouse.left);
  158.  
  159.             // Borra los textos que ya no sirven
  160.             delete_text(texto1);
  161.             delete_text(texto2);
  162.             delete_text(texto3);
  163.             IF (nivel>0)
  164.                 delete_text(texto4);
  165.                 delete_text(texto5);
  166.             END
  167.  
  168.             // Inicializa otras variables
  169.             mensaje_récord=FALSE;   // Puesto mensaje de record
  170.             timer=0;                // Contador de tiempo
  171.  
  172.             // Bucle principal de cada nivel de juego
  173.             REPEAT
  174.  
  175.                 // Calcula los tiempos de juego y récord
  176.                 tiempo_anterior=tiempo;
  177.                 tiempo=tiempos[nivel]+tiempo_restante-timer/100;
  178.                 récord=récords[nivel]-timer/100;
  179.  
  180.                 // Crea los procesos tipo mensaje con una frase sobre el tiempo restante
  181.                 IF (tiempo_anterior==121 AND tiempo==120) mensaje("QUEDAN 2 MINUTOS",220); END
  182.                 IF (tiempo_anterior==61 AND tiempo==60) mensaje("1 MINUTO, DATE PRISA!",220); END
  183.                 IF (tiempo_anterior==11 AND tiempo==10) mensaje("10 SEGUNDOS SOLO !!!",220); END
  184.                 IF (tiempo_anterior==6 AND tiempo==5) mensaje("CINCO !!!",220); END
  185.                 IF (tiempo<0) tiempo=0; END
  186.  
  187.                 // Comprueba si ya no se puede hacer récord
  188.                 IF (récord<0)
  189.                     récord=0;
  190.                     // Pone el mensaje de récord perdido
  191.                     IF (NOT mensaje_récord)
  192.                         mensaje_récord=TRUE;
  193.                         mensaje("RECORD PERDIDO!",260);
  194.                     END
  195.                 END
  196.  
  197.                 // Si se pulsa la tecla escape sale al menu
  198.                 IF (key(_esc)) tiempo=-1; BREAK; END
  199.                 FRAME;
  200.  
  201.             // Repite hasta que se acabe el tiempo o coloque todas las piezas
  202.             UNTIL (piezas_colocadas==35 OR tiempo==0);
  203.  
  204.             // Comprueba si se ha pasado de nivel o se ha acabado el tiempo
  205.             IF (piezas_colocadas==35)   // Nivel conseguido
  206.                 sound(idsonido7,128,256);
  207.  
  208.                 // Pone el mensaje de felicitación
  209.                 write(fuente,320,220,4,"LO CONSEGUISTES");
  210.  
  211.                 // Comprueba si se ha conseguido un récord y lo guarda
  212.                 IF (récords[nivel]>tiempos[nivel]+tiempo_restante-tiempo)
  213.                     write(fuente,320,245,4,"NUEVO RECORD!!!");
  214.                     récords[nivel]=tiempos[nivel]+tiempo_restante-tiempo;
  215.                 END
  216.  
  217.                 // Guarda el tiempo sobrante para el siguiente nivel
  218.                 write(fuente,320,290,4,"TIEMPO SOBRANTE");
  219.                 write_int(fuente,320,320,4,&tiempo);
  220.                 tiempo_restante=tiempo;
  221.  
  222.             ELSE    // Si no, se le ha acabado el tiempo
  223.  
  224.                 sound(idsonido6,128,256);   // Hace un sonido
  225.  
  226.                 // Pone el mensaje de final de juego y lo reinicia
  227.                 IF (tiempo>=0)
  228.                     write(fuente,320,220,4,"OHHH, FUERA DE TIEMPO!");
  229.                 ELSE
  230.                     tiempo=0;
  231.                 END
  232.                 write(fuente,320,260,4,"FIN DE JUEGO");
  233.             END
  234.  
  235.             // Pone el mensaje de pulsar el ratón para continuar
  236.             write(fuente,320,440,4,"PULSE EL RATON PARA CONTINUAR");
  237.             WHILE (mouse.left) FRAME; END
  238.  
  239.             // Espera a que se pulse el ratón
  240.             REPEAT FRAME; UNTIL (mouse.left);
  241.             fade_off();             // Apaga la pantalla
  242.             delete_text(all_text);  // Borra cualquier texto
  243.  
  244.             // Elimina los procesos que hubiera y descarga los ficheros de memoria
  245.             signal(TYPE pieza,s_kill);
  246.             unload_fnt(fuente);
  247.             unload_fpg(fichero);
  248.  
  249.  
  250.             nivel++;            // Incrementa el nivel de juego
  251.  
  252.             // Juego finalizado, todos los puzzles conseguidos
  253.             IF (nivel>4) nivel=4; pantalla_final(); FRAME; END
  254.  
  255.             // Mira si se ha acabado por no poner todas las piezas
  256.             IF (piezas_colocadas<35) BREAK; END
  257.         END
  258.  
  259.         // Apaga la pantalla y borra cualquier proceso que hubiera abierto
  260.         fade_off();
  261.         let_me_alone();
  262.     END
  263. END
  264.  
  265. //--------------------------------------------------------------------
  266. // Proceso pieza
  267. // Maneja las piezas del puzzle
  268. // Entradas: Variable predefinidas
  269. //           mi_x, mi_y = coordenadas dentro del puzzle
  270. //--------------------------------------------------------------------
  271.  
  272. PROCESS pieza(graph,x,y,angle,mi_x,mi_y);
  273.  
  274. PRIVATE
  275.     contador;       // Contador de uso general
  276.     incr_x,incr_y;  // Distancia entre el punto medio de la pieza y el ratón
  277.  
  278. BEGIN
  279.     LOOP
  280.         // Si no hay ninguna cogida y esta pulsado el ratón
  281.         IF (NOT cogida AND mouse.left)
  282.  
  283.             // Si esta tocando la pieza
  284.             IF (collision(TYPE mouse))
  285.                 sound(idsonido1,128,256);
  286.                 cogida=1;       // Pon la variable como que se esta cogiendo una pieza
  287.                 z=última_z;     // La pone por delante de todas
  288.                 última_z--;
  289.  
  290.                 // Coge la distancia al ratón para luego usarla
  291.                 incr_x=x-mouse.x;
  292.                 incr_y=y-mouse.y;
  293.  
  294.                 // Repite hasta que se suelte el ratón
  295.                 REPEAT
  296.                     // Hace que siga al ratón desde la distancia a la que esta
  297.                     x=mouse.x+incr_x;
  298.                     y=mouse.y+incr_y;
  299.  
  300.                     // Si tiene el ángulo correcto
  301.                     IF (angle MOD 360000==0)
  302.  
  303.                         // Y hay una distancia menor de 6 pixels a su posición correcta
  304.                         IF (fget_dist(x,y,mi_x,mi_y)<6)
  305.                             sound(idsonido4,128,256);
  306.  
  307.                             // Coloca la pieza (pieza conseguida)
  308.                             x=mi_x; y=mi_y; z=1;
  309.                             piezas_colocadas++;
  310.                             cogida=0;
  311.  
  312.                             // Y no hace mas cosas con la pieza, se mete en un bucle enemigo
  313.                             LOOP FRAME; END
  314.                         END
  315.                     END
  316.                     FRAME;
  317.                 UNTIL (mouse.left==0);
  318.  
  319.                 cogida=0;   // Ya no se tiene ninguna pieza cogida
  320.                 // Hace el sonido de dejada
  321.                 sound(idsonido2,128,256);
  322.             END
  323.         END
  324.  
  325.         // Si no se esta rotando ninguna pieza y se pulsa el botón derecho
  326.         IF (NOT rotando AND mouse.right)
  327.  
  328.             // Comprueba si se esta tocando alguna pieza
  329.             IF (collision(TYPE mouse))
  330.                 sound(idsonido3,64,96);
  331.  
  332.                 // Pone la variable como que se esta rotando
  333.                 rotando=1;
  334.                 z=última_z;
  335.                 última_z--;
  336.  
  337.                 // Gira la pieza de 10 en 10 grados, en un total de 90
  338.                 FROM contador=0 TO 8; angle+=10000; FRAME; END
  339.  
  340.                 // Hace rotativo el giro por si se pasa de 360000
  341.                 IF (angle==360000) angle=0; END
  342.                 rotando=0;
  343.             END
  344.         END
  345.         FRAME;
  346.     END
  347. END
  348.  
  349. //--------------------------------------------------------------------
  350. // Proceso mensaje
  351. // Pone los mensajes que aparecen durante el juego
  352. // Entradas: texto = Texto que se quiere imprimir
  353. //           y     = Coordenada y del texto
  354. //--------------------------------------------------------------------
  355.  
  356. PROCESS mensaje(texto,y);
  357.  
  358. PRIVATE
  359.     idtexto;    // Identificador del texto a imprimir
  360.  
  361. BEGIN
  362.     sound(idsonido5,64,256);    // Hace sonido de alarma
  363.  
  364.     // Pone el texto
  365.     idtexto=write(fuente,320,y,4,texto);
  366.  
  367.     // Hace frame pero con pausa
  368.     FRAME(600);
  369.  
  370.     // Quita el texto
  371.     delete_text(idtexto);
  372.  
  373.     // Hace que se espera si imprimir nada
  374.     FRAME(600);
  375.  
  376.     sound(idsonido5,64,256);    // Hace otra vez el sonido de alarma
  377.  
  378.     // Lo repite 3 veces mas el mismo proceso de arriba
  379.     idtexto=write(fuente,320,y,4,texto);
  380.     FRAME(600);
  381.     delete_text(idtexto);
  382.     FRAME(600);
  383.     sound(idsonido5,64,256);
  384.     idtexto=write(fuente,320,y,4,texto);
  385.     FRAME(600);
  386.     delete_text(idtexto);
  387.     FRAME(600);
  388.     sound(idsonido5,64,256);
  389.     idtexto=write(fuente,320,y,4,texto);
  390.     FRAME(600);
  391.     delete_text(idtexto);   // Se acaba borrando el texto
  392. END
  393.  
  394. //--------------------------------------------------------------------
  395. // Proceso pantalla_final
  396. // Pone los mensajes que aparecen al acabar todos los puzzle
  397. //--------------------------------------------------------------------
  398.  
  399. PROCESS pantalla_final()
  400. BEGIN
  401.  
  402.     // Apaga y borra la pantalla y pone la del final del juego
  403.     fade_off();
  404.     let_me_alone();                         // Borra todos los procesos
  405.     load_pal("puzzle\puzfinal.map");
  406.     graph=load_map("puzzle\puzfinal.map");  // Usa la variable graph para cargar el mapa gráfico
  407.     put_screen(0,graph);
  408.     unload_map(graph);                      // Descarga el mapa gráfico de memoria
  409.     fade_on();                              // Enciende la pantalla
  410.  
  411.     // Espera a que se pulse una tecla y sale del juego
  412.     WHILE (scan_code==0)
  413.         FRAME;
  414.     END
  415.     exit("Gracias por jugar!",0);           // Sale del programa
  416.  
  417. END